import type { SliceFileSqliteType } from "@/sqlite/sliceFile";
import type { FetchBlobResponse } from "react-native-blob-util";

// 文件下载和文件上传的基础配置
export type BaseFileOption = {
  /** 上传或下载的url */
  url: string;
  /** 上传或下载的请求方法 */
  method: "GET" | "POST";
  /** 上传或下载的请求头 */
  headers?: { [k in string]: string };
  /** 上传或下载文件的 mime type, 默认为: text/plain */
  mime?: string;
};

/** 下载文件配置 */
export type DownFileOption = BaseFileOption & {
  /** 下载栏的标题 */
  title?: string;
  /** 下载栏的说明 */
  description?: string;
  /** 下载的文件到本地的地址 */
  downFileToNativePath: string;
};

/** 上传文件配置 */
export type UploadFileOption = BaseFileOption & {
  /** 上传的文件名 */
  fileName: string;
  /** 上传的文件地址 */
  filePath: string;
  /** 对应 formData 里的键 */
  formDataKey: string;

  /** 其它 formData 数据 */
  otherFormData?: {
    /** 名称 */
    name: string;
    /** 数据 */
    data: any;
  }[];
};


// 分片下载的配置参数
export type SliceDownloadOptionType = Pick<BaseFileOption, "url" | "method" | "headers"> & {

  /** 文件大小 */
  fileSize: number;

  /** 分片大小 */
  rangeSize: number;

  /** 下载的文件地址 */
  downloadFilePath: string;

  /** 如果还有其他未下载完成的文件则下载完成 */
  restDownload?: boolean;

  /** 测试错误(用于调试断点下载功能) */
  testError?: boolean;

  /** 当前下载的文件还有未下载成功时回调 */
  onCurrentRestDownload?: (fileList: SliceFileSqliteType[]) => void;

  /** 当本地存在未下载成功文件时回调 */
  onSomeRestDownload?: (fileList: SliceFileSqliteType[]) => void;

  /** 分片文件下载之前回调 */
  onBeforeSliceDownFile?: (opt: DownFileCallbackParams) => void;

  /** 分片文件下载之后回调 */
  onAfterSliceDownFile?: (
    opt: DownFileCallbackParams & {
      /** 下载响应 */
      response: FetchBlobResponse;
    }
  ) => void;

  /** 分片文件下载时发生错误回调 */
  onSliceFileDownError?: (fileInfo: SliceFileSqliteType) => void;

  /** 文件未下载完成回调 */
  onUnfinishFileDown?: (fileInfo: BuildSliceToFileOption & {
    /** 未下载完成的分为文件信息 */
    errFileList: SliceFileSqliteType[]
  }) => void;

  /** 合并分片文件为一个完整文件回调 */
  onBuildSliceFile?: (opt: BuildSliceToFileOption) => void;
};

/** 下载文件回调参数 */
export type DownFileCallbackParams = Pick<
  SliceFileSqliteType,
  "startRange" | "endRange" | "rangeCountSum" | "currentCount" | "downloadFilePath"
> & {
  /** 是否是剩余未下载完成的切片下载 */
  isRestSliceDownload: boolean;
};


/** 分片构建文件参数 */
export type BuildSliceToFileOption = {
  /** 文件路径 */
  filePath: string;
  /** 文件目录 */
  tempFileDir: string;
  /** 下载的文件地址 */
  filePaths: string[];
}